package org.xandroid.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * 用于发起网络请求的类，包含网络请求，下载等功能
 * @author Kross(Krossford@foxmail.com)
 * @date 2014-3-23 15:43:19
 * */
public class XRequestHelper {
	
	/**
	 * 发起一条网络请求，并返回String类型的结果
	 * @param url 需要请求的地址
	 * @param headerKeys header信息的键（数组）
	 * @param headerValues header信息的值（数组）
	 * @param method 请求的方式是POST还是GET，请使用X.Method中的常量
	 * @param keys 请求发送的键（数组）
	 * @param values 请求发送的值（数组）
	 * @param timeoutMillis 超时的时长，毫秒
	 * @return 请求返回的字符串
	 * @throws IOException 
	 * @throws MalformedURLException 
	 * */
	public String request(String url, String[] headerKeys, String[] headerValues, int method, String[] keys, String[] values, int timeoutMillis) throws MalformedURLException, IOException {
		HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection();
		
		//添加header信息
		for (int i = 0; i < headerKeys.length; i++) {
			conn.addRequestProperty(headerKeys[i], headerValues[i]);
		}
		
		conn.setRequestMethod(getMethod(method));
		
		StringBuffer params = new StringBuffer();
		
		for (int i = 0; i < keys.length; i++) {
			params.append(keys[i]).append("=").append(values[i]);
			if (i != keys.length - 1) {
				params.append("&");
			}
		}
        byte[] bytes = params.toString().getBytes();
        conn.getOutputStream().write(bytes);
        
        conn.connect();
        conn.setConnectTimeout(timeoutMillis);
        
        return getStringFromInputStream(conn.getInputStream());
	}
	
	/**
	 * 获取请求方法的字符串，根据X.Method中的常量
	 * @param X.Method中的常量
	 * @return 返回相对应的字符串
	 * */
	private String getMethod(int method) {
		switch (method) {
		default:
		case X.Method.GET:
			return "get";
		case X.Method.POST:
			return "post";
		}
	}
	
	/**
	 * 从输入流中获取字符串
	 * @param is 输入流
	 * @return 返回从输入流中获取的字符串数据
	 * */
	private String getStringFromInputStream(InputStream is) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
        StringBuffer data = new StringBuffer();
        String line = "";
        while ((line = br.readLine()) != null) {
             data.append(line);
        }
        return data.toString();
	}
}
